'''
列表
'''
import sys

list1 = [1, 3, 5, 8, 100]
print(list1)
list2 = ['hello'] * 3
print(list2)
# 列表长度
print(len(list1))
# 根据索引获取列表元素
print(list1[2]) # 5
# print(list1[5]) # IndexError: list index out of range
# 从右侧开始获取第一个元素
print(list1[-1]) # 100
# 在指定位置设置新的元素
list1[2] = 200
print(list1)
# for 遍历列表
for a in list1:
    print(a)
# 通过enumerate函数处理列表之后再遍历可以同时获得元素索引和值
for index, elem in enumerate(list1):
    print(index, elem)


'''
向列表中添加和删除元素
'''
list0 = [1, 3, 5, 6, 30]
# 添加元素
list0.append(100)
list0.insert(1, 123)
print(list0) # [1, 123, 3, 5, 6, 30, 100]
list0 += [1001, 1005]
print(list0) # [1, 123, 3, 5, 6, 30, 100, 1001, 1005]
# 判断成员是否存在，存在则删除
if 3 in list0:
    list0.remove(3)
print(list0)   # [1, 123, 5, 6, 30, 100, 1001, 1005]
# 从指定位置删除元素
list0.pop(0)
list0.pop(len(list0) - 1)
print(list0) # [123, 5, 6, 30, 100, 1001]
# 清空元素
list0.clear()
print(list0) # []

'''
列表切片
'''
fruits = ['apple', 'banana', 'orange', 'watermelon']
fruits += ['pear', 'mango', 'strawberry']
fruits2 = fruits[1:4]
print(fruits2) # ['banana', 'orange', 'watermelon']
# 可以通过完整切片操作来复制列表
fruits3 = fruits[:]
print(fruits3) # ['apple', 'banana', 'orange', 'watermelon', 'pear', 'mango', 'strawberry']
# 截取从右侧开始算 第3到第1位(不包含)
fruits4 = fruits[-3:-1]
print(fruits4) # ['pear', 'mango']
# 可以通过反向切片操作来获得倒转后的列表的拷贝
fruits5 = fruits[::-1]
print(fruits5) # ['strawberry', 'mango', 'pear', 'watermelon', 'orange', 'banana', 'apple']

'''
列表排序
'''
list1 = ['orange', 'apple', 'zoo', 'internationalization', 'blueberry']
list2 = sorted(list1)
print(list2) # ['apple', 'blueberry', 'internationalization', 'orange', 'zoo']
# sorted函数返回列表排序后的拷贝不会修改传入的列表
# 函数的设计就应该像sorted函数一样尽可能不产生副作用
list3 = sorted(list1, reverse=True) # 排序后反转
print(list3) # ['zoo', 'orange', 'internationalization', 'blueberry', 'apple']
# 通过key关键字参数指定根据字符串长度进行排序而不是默认的字母表顺序
list4 = sorted(list1, key=len)
print(list4) # ['zoo', 'apple', 'orange', 'blueberry', 'internationalization']
# 给列表对象发出排序消息直接在列表对象上进行排序
list1.sort(reverse=True)
print(list1) # ['zoo', 'orange', 'internationalization', 'blueberry', 'apple']

'''
生成式和生成器
'''
f = [x for x in range(1, 10)]
print(f) # [1, 2, 3, 4, 5, 6, 7, 8, 9]
# 相当于嵌套for循环
f = [x + y for x in 'ABCDE' for y in '1234567']
print(f) # ['A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'A7', 'B1', 'B2', 'B3', 'B4', 'B5', 'B6', 'B7', 'C1', 'C2', 'C3', 'C4', 'C5', 'C6', 'C7', 'D1', 'D2', 'D3', 'D4', 'D5', 'D6', 'D7', 'E1', 'E2', 'E3', 'E4', 'E5', 'E6', 'E7']
# 用列表的生成表达式语法创建列表容器
# 用这种语法创建列表之后元素已经准备就绪所以需要耗费较多的内存空间
f = [x ** 2 for x in range(1, 1000)]
print(sys.getsizeof(f))  # 查看对象占用内存的字节数
print(f)

'''
元组，相对于列表，元组不能修改,使用小括号，可以理解为元组是不可变列表，可以相互转换
'''
t = ('张三', 33, '广州', 1)
print(t) # ('张三', 33, '广州', 1)
print(t[0]) # 张三
print(t[2]) # 广州
# 遍历元组
for a in t:
    print(a)

# 重新赋值元组
t = ('李四', 23, '武汉', 0)
print(t) # ('李四', 23, '武汉', 0)
# 元组转列表
person = list(t)
person[0] = '王五'
person[1] = 29
print(person) # ['王五', 29, '武汉', 0]
# 列表转元组
fruits_list = ['apple', 'banana', 'orange']
fruits_tuple = tuple(fruits_list)
print(fruits_tuple)